/**
 * @module analysis
 * @description
 * 这个模块提供了一系列用于分析 `TerrainSchematic` 实例并提取数据的函数。
 * 例如，计算尺寸、统计材料成本等。
 * 这些函数不会修改传入的蓝图实例。
 */

import type TerrainSchematic from "../schematic";

/**
 * 获取当前蓝图的尺寸（大小）。
 * @returns 一个包含x, y, z尺寸的GameVector3对象。
 * @throws 如果内部数据无效或缺少边界信息，则抛出错误。
 */
export function getDimensions(schematic: TerrainSchematic): GameVector3 {
  if (
    !schematic.data.bounds ||
    !schematic.data.bounds.lo ||
    !schematic.data.bounds.hi
  ) {
    throw new Error("无效的蓝图数据，缺少边界信息");
  }
  // 尺寸信息现在直接从 bounds 计算，因为旋转/翻转后 bounds 会更新
  const size = (schematic.data.bounds.hi as GameVector3)
    .sub(schematic.data.bounds.lo as GameVector3)
    .add(new GameVector3(1, 1, 1));
  return size;
}

/**
 * 计算并返回构建当前蓝图所需的所有材料及其数量。
 * @returns 一个 `Map`，其中键是方块ID (`voxelId`)，值是方块数量。
 * @throws 如果内部数据无效，则抛出错误。
 */
export function getMaterialCost(
  schematic: TerrainSchematic
): Map<voxelId, number> {
  const { palette: flattenedPalette } = schematic.data;
  if (!flattenedPalette) {
    throw new Error("无效的蓝图数据");
  }
  const costMap = new Map<voxelId, number>();

  const palette: { id: voxelId; rot: voxelRotation }[] = [];
  for (let i = 0; i < flattenedPalette.length; i += 2) {
    palette.push({
      id: flattenedPalette[i] as voxelId,
      rot: flattenedPalette[i + 1] as voxelRotation,
    });
  }

  const paletteCounts: number[] = new Array(palette.length).fill(0);

  for (const block of schematic.schematicBlocks) {
    if (block.p >= 0 && block.p < paletteCounts.length) {
      paletteCounts[block.p]++;
    }
  }

  for (let i = 0; i < palette.length; i++) {
    const blockType = palette[i];
    const count = paletteCounts[i];
    if (count > 0) {
      costMap.set(blockType.id, (costMap.get(blockType.id) || 0) + count);
    }
  }

  return costMap;
}
